#include "../log/blotlog.h"
#include <iostream>
#include <thread>
#include <chrono>

/**
 * 日志级别使用示例
 * 演示不同日志级别的使用场景和最佳实践
 */

void simulateUserLogin(const std::string& username, bool success) {
    if (success) {
        INFO("用户 %s 登录成功", username.c_str());
        DEBUG("登录详情: IP=192.168.1.100, 浏览器=Chrome, 时间戳=%ld", 
              std::chrono::duration_cast<std::chrono::seconds>(
                  std::chrono::system_clock::now().time_since_epoch()).count());
    } else {
        WARN("用户 %s 登录失败，密码错误", username.c_str());
        ERROR("连续登录失败，可能存在暴力破解风险");
    }
}

void simulateDataProcessing() {
    std::cout << "\n=== 数据处理流程日志示例 ===" << std::endl;
    
    INFO("开始数据处理流程");
    
    // 模拟处理步骤
    for (int i = 1; i <= 3; ++i) {
        DEBUG("处理数据批次 %d/3", i);
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
        
        if (i == 2) {
            WARN("数据批次 %d 包含异常值，已自动修正", i);
        }
    }
    
    INFO("数据处理完成，共处理 3 个批次");
}

void simulateErrorHandling() {
    std::cout << "\n=== 错误处理日志示例 ===" << std::endl;
    
    try {
        INFO("尝试连接数据库");
        
        // 模拟数据库连接失败
        bool dbConnected = false;
        if (!dbConnected) {
            ERROR("数据库连接失败: 连接超时");
            WARN("尝试使用备用数据库");
            
            // 模拟备用数据库也失败
            bool backupDbConnected = false;
            if (!backupDbConnected) {
                FATAL("所有数据库连接均失败，系统无法继续运行");
                throw std::runtime_error("Database connection failed");
            }
        }
    } catch (const std::exception& e) {
        ERROR("捕获异常: %s", e.what());
    }
}

void demonstrateLogLevels() {
    std::cout << "\n=== 各日志级别详细说明 ===" << std::endl;
    
    // DEBUG: 调试信息，通常在开发阶段使用
    DEBUG("DEBUG级别: 用于调试信息，包含详细的程序执行流程");
    
    // INFO: 一般信息，记录程序正常运行的关键节点
    INFO("INFO级别: 记录程序正常运行的重要信息");
    
    // WARN: 警告信息，程序可以继续运行但需要注意
    WARN("WARN级别: 警告信息，程序可继续但存在潜在问题");
    
    // ERROR: 错误信息，程序遇到错误但可以恢复
    ERROR("ERROR级别: 错误信息，程序遇到错误但可以继续运行");
    
    // FATAL: 致命错误，程序无法继续运行
    FATAL("FATAL级别: 致命错误，程序可能需要终止");
}

int main() {
    std::cout << "=== BoltLog 日志级别使用示例 ===" << std::endl;
    
    // 演示各日志级别的基本用法
    demonstrateLogLevels();
    
    std::cout << "\n=== 用户登录场景示例 ===" << std::endl;
    
    // 模拟用户登录场景
    simulateUserLogin("admin", true);
    simulateUserLogin("guest", false);
    simulateUserLogin("hacker", false);
    
    // 模拟数据处理场景
    simulateDataProcessing();
    
    // 模拟错误处理场景
    simulateErrorHandling();
    
    std::cout << "\n=== 性能相关日志示例 ===" << std::endl;
    
    auto start = std::chrono::high_resolution_clock::now();
    
    // 模拟一些操作
    std::this_thread::sleep_for(std::chrono::milliseconds(50));
    
    auto end = std::chrono::high_resolution_clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
    
    if (duration.count() > 100) {
        WARN("操作耗时过长: %ldms", duration.count());
    } else {
        DEBUG("操作完成，耗时: %ldms", duration.count());
    }
    
    std::cout << "\n日志级别示例完成！" << std::endl;
    return 0;
}